#include <iostream>
#include <vector>
#include <sw/redis++/redis++.h>
#include <thread>
#include "../util.hpp"

using std::cout;
using std::endl;
using std::string;
using sw::redis::Redis;
using std::vector;

void test1(Redis& redis)
{
    // hset 和 hget（hmset的功能hset也有）
    redis.flushall();

    // 设置一个field-value
    redis.hset("key1", "k1", "1");

    // 通过pair设置一个field-value
    redis.hset("key1", std::make_pair("k2", "2"));

    // 通过初始化列表设置多个
    redis.hset("key1", {std::make_pair("k3", "3"), std::make_pair("k4", "4")});

    // 通过迭代器设置多个
    vector<std::pair<string, string>> v = {
        std::make_pair("k5", "5"), 
        std::make_pair("k6", "6")};
    redis.hset("key1", v.begin(), v.end());

    sw::redis::OptionalString s = redis.hget("key1", "k3");
    if(s)
        cout << s.value() << endl;
    else
        cout << "不存在" << endl;

    s = redis.hget("key1", "k6");
    if(s)
        cout << s.value() << endl;
    else
        cout << "不存在" << endl;
}

void test2(Redis& redis)
{
    // hmset 和 hmget（hmset的功能hset也有）
    redis.flushall();

    // 初始化列表
    redis.hmset("key1", {std::make_pair("k1", "1"), std::make_pair("k2", "2")});

    // 迭代器
    vector<std::pair<string,string>> v = {std::make_pair("k3", "3"), std::make_pair("k4", "4")};
    redis.hmset("key1", v.begin(), v.end());

    vector<string> result;
    std::back_insert_iterator<vector<string>> it = std::back_inserter(result);
    // 初始化列表获取到容器中
    redis.hmget("key1", {"k1", "k2", "k3"}, it); // 如果你要用vector<string>类型存储查找的元素，那么必须保证初始化列表中的field都存在，负责抛出异常
    printContainer(result);

    vector<sw::redis::OptionalString> result1;
    std::back_insert_iterator<vector<sw::redis::OptionalString>> it1 = std::back_inserter(result1);
    // 初始化列表获取到容器中
    redis.hmget("key1", {"k1", "k2", "k9"}, it1); // 如果初始化列表中存在不存在的field，使用vector<sw::redis::OptionalString>存储
    printContainerOptional(result1);
}

void test3(Redis& redis)
{
    // hexists
    redis.flushall();

    // 初始化列表
    redis.hmset("key1", {std::make_pair("k1", "1"), std::make_pair("k2", "2")});

    bool f = redis.hexists("key1", "k1");
    if(f)
        cout << "存在" << endl;
    else
        cout << "不存在" << endl;
}

void test4(Redis& redis)
{
    // hkeys 和 hvals
    redis.flushall();

    // 初始化列表
    redis.hmset("key1", {std::make_pair("k1", "1"), std::make_pair("k2", "2")});

    vector<string> field_results;
    auto it_field = std::back_inserter(field_results);
    redis.hkeys("key1", it_field);
    printContainer(field_results);

    cout << "------------------------------\n";
    vector<string> value_results;
    auto it_value = std::back_inserter(value_results);
    redis.hvals("key1", it_value);
    printContainer(value_results);
}

void test5(Redis& redis)
{
    // hdel使用
    redis.flushall();

    // 初始化列表
    redis.hmset("key1", {std::make_pair("k1", "1"), std::make_pair("k2", "2"), 
                        std::make_pair("k3", "3"), std::make_pair("k4", "4"),
                        std::make_pair("k5", "5"), std::make_pair("k6", "6")});

    // 删除一个
    long long n = redis.hdel("key1", "k1");
    cout << n << endl;

    n = redis.hdel("key1", {"k1", "k2", "k3"});
    cout << n << endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);
    return 0;
}